package com.pizza.control;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;

import javax.faces.context.FacesContext;

import com.pizza.abstrait.AbstractArticle;
import com.pizza.abstrait.AbstractClient;
import com.pizza.abstrait.AbstractCommande;
import com.pizza.abstrait.AbstractCommandeLigneArticle;
import com.pizza.abstrait.AbstractCommandeLigneFormule;
import com.pizza.abstrait.AbstractCommandeLignePizza;
import com.pizza.abstrait.AbstractPizza;
import com.pizza.database.PizzaManagerClient;
import com.pizza.model.Commande;
import com.pizza.model.CommandeLigneArticle;
import com.pizza.model.CommandeLignePizza;
import com.pizza.model.Diametre;
import com.pizza.model.Pizza;

/**
 * Class CommandeBean
 *
 */
public class CommandeBean extends AbstractCommande {

	private ArrayList<CommandeBean> panier;

	private int etape;
	
	private boolean vide;
	
	private boolean pizzasVide;
	
	private boolean articlesVide;
	
	private int nbElements;
	
	
		
	public CommandeBean() {
		
		initialiserCommande();
		etape = 1;
		panier = new ArrayList<CommandeBean>();
		panier.add(this);

	}
		
	public void initialiserCommande() {
		int id = 0;
		client = null;
		remise = null;
		
		total = 0f;
		etat = null;
		tva = 0f;
		date = null;
		livraison = true;
		pizzas = new ArrayList<AbstractCommandeLignePizza>();
		articles = new ArrayList<AbstractCommandeLigneArticle>();
		formules = new ArrayList<AbstractCommandeLigneFormule>();
		vide = true;
	}

	// Redefinition du getClient
	public AbstractClient getClient() {
		AbstractClient connectedUser = (AbstractClient) FacesContext
				.getCurrentInstance().getExternalContext().getSessionMap().get(
						"clientBean");
		if (connectedUser != null) {
			setClient(connectedUser);
		}
		return super.getClient();
	}

	public ArrayList getPanier() {
		return panier;
	}

	public void setPanier(ArrayList panier) {
		this.panier = panier;
	}

	public int getEtape() {
		return etape;
	}

	public void setEtape(int etape) {
		this.etape = etape;
	}
	
	public float getTva() {
		return new Float(this.getTotal() - (this.getTotal() / 1.055)).floatValue();
	}

	public int getNbElements() {
		int nb = 0;
		for(int i=0; i < getArticles().size(); i++) {
			nb += getArticles().get(i).getQuantite();
		}
		for(int i=0; i < getPizzas().size(); i++) {
			nb += getPizzas().get(i).getQuantite();
		}
		return nb;
	}

	public void setNbElements(int nbElements) {
		this.nbElements = nbElements;
	}
	
	public boolean isVide() {
		return (this.getArticles().size() == 0 && this.getPizzas().size() == 0);
	}

	public void setVide(boolean vide) {
		this.vide = vide;
	}
	
	public boolean isArticlesVide() {
		return (this.getArticles().size() == 0);
	}

	public void setArticlesVide(boolean articlesVide) {
		this.articlesVide = articlesVide;
	}

	public boolean isPizzasVide() {
		return (this.getPizzas().size() == 0);
	}

	public void setPizzasVide(boolean pizzasVide) {
		this.pizzasVide = pizzasVide;
	}
	

	// Validation PANIER
	public String validerEtape1() {
		// Commande effectuée, passage à l'identification client et choix du lieu de livraison
		etape = 2;
		return "validpanier";
	}
	
	// Validation Livraison
	public void validerEtape2() {
		// Client inscrit et connecté, livraison choisie, passage au récapitulatif
		etape = 3;
	}
	
	// Validation Recapitulatif
	public void validerEtape3() {
		// Livraison choisie, affichage du recapitulatif et passage au paiement
		etape = 4;
	}
	
	// Modification Panier
	public void modifierPanier() {
		etape = 1;
	}
	
	// Validation Paiement
	public void validerEtape4() {
		// Paiement validé, passage a l'enregistrement final de la commande
		// Enregistrement dans la base des pizzas persos
		// Enregistrement dans la base de la commande, affichage de la confirmation avec le no de commande
		try {
			for(int i=0; i<getPizzas().size(); i++){
				if(getPizzas().get(i).getPizza().isPersonnalisee()) {
					AbstractPizza pizza = getPizzas().get(i).getPizza();
					Pizza p = new Pizza(pizza.getNom(), pizza.getDescription(), pizza.getUrl_image(), pizza.getClientPizzaPerso(), pizza.getDiametres(), pizza.getIngredients());
					int id_pizza = PizzaManagerClient.GetPizzaManager().createPizzasPerso(p);
					pizza.setId(id_pizza);
				}
			}
			
			Commande c = new Commande(getClient(), getRemise(), getAdresseLivraison(), getTotal(), getEtat(), getTva(), new Date(), isLivraison(), getPizzas(), getArticles(), getFormules());
			PizzaManagerClient.GetPizzaManager().createCommandeDB(c);
			this.setId(c.getId());
		} catch (RemoteException e) {
			this.setId(-1);
			System.err.println("Erreur création de commande (insert dans la bdd)"+e);
		}
		
		etape = 5;
	}
	
	// Retour boutique
	public String retourBoutique() {
		etape = 1;
		this.initialiserCommande();
		return "pizzas";
	}
	
	// Ajout d'un nouvel article dans la commande
	public void ajouterArticlePanier(AbstractArticle article) {
		boolean articleDejaPresent = false;
		for(int i=0; i < getArticles().size(); i++) {
			if(getArticles().get(i).getArticle().equals(article)) {
				getArticles().get(i).setQuantite(getArticles().get(i).getQuantite()+1);
				articleDejaPresent = true;
			}
		}
		if(!articleDejaPresent) {
			AbstractCommandeLigneArticle nouvelleLigne = new CommandeLigneArticle(article, 1, article.getPrix(), this);
			this.addArticle(nouvelleLigne);
		}
	}
	
	// Ajout d'une nouvelle pizza dans la commande
	public void ajouterPizzaPanier(AbstractPizza pizza, Diametre diametre) {
		boolean pizzaDejaPresente = false;
		for(int i=0; i < getPizzas().size(); i++) {
			if(getPizzas().get(i).getPizza().equals(pizza) && getPizzas().get(i).getDiametre().equals(diametre)) {
				getPizzas().get(i).setQuantite(getPizzas().get(i).getQuantite()+1);
				pizzaDejaPresente = true;
			}
		}
		if(!pizzaDejaPresente) {
			AbstractCommandeLignePizza nouvelleLigne = new CommandeLignePizza(pizza, diametre, 1, pizza.getPrix(diametre), this);
			this.addPizza(nouvelleLigne);
		}
	}

	

	

	
	
}
